Verken de kracht van de Web USB API voor naadloze toegang tot en beheer van USB-apparaten in webapplicaties, gericht op wereldwijde ontwikkelaars.
De Frontend Web USB API: Een Brug Tussen Browsers en Fysieke Apparaten
In de steeds meer verbonden wereld van vandaag zijn webapplicaties niet langer beperkt tot het weergeven van statische informatie of het uitvoeren van puur online taken. De wens om rechtstreeks vanuit de browser met de fysieke wereld te interageren is nog nooit zo sterk geweest. Van wetenschappelijke instrumenten tot slimme apparaten in huis, en van industriƫle besturingssystemen tot gepersonaliseerde gadgets, het potentieel voor webgebaseerde hardwarebesturing is enorm en grotendeels onbenut. Dit is waar de Frontend Web USB API op het toneel verschijnt en ontwikkelaars een krachtige en gestandaardiseerde manier biedt om rechtstreeks via webbrowsers met USB-apparaten te communiceren.
Voor een wereldwijd publiek van ontwikkelaars kan het begrijpen en benutten van de Web USB API nieuwe grenzen in innovatie ontsluiten. Stel je een student in Nairobi voor die een microscoop, aangesloten via USB op zijn laptop, kan bedienen; een fabrieksmanager in Seoul die sensorgegevens van machines in realtime monitort via een webdashboard; of een hobbyist in Berlijn die aangepaste lichteffecten ontwerpt voor zijn project met een via USB bestuurde ledstrip ā allemaal zonder speciale software te installeren. De Web USB API maakt deze scenario's, en talloze andere, een tastbare realiteit.
Wat is de Web USB API?
De Web USB API is een JavaScript-API waarmee webapplicaties kunnen communiceren met USB-apparaten (Universal Serial Bus). Ontwikkeld als onderdeel van de WebUSB-specificatie, heeft het als doel een veilige en gestandaardiseerde methode te bieden voor webpagina's om USB-randapparatuur te ontdekken, ermee te verbinden en gegevens te verzenden/ontvangen. Historisch gezien was directe USB-toegang vanuit webbrowsers onmogelijk of vereiste het eigen plug-ins en native applicaties, wat aanzienlijke drempels opwierp en de cross-platform compatibiliteit beperkte.
De Web USB API beoogt hardware-interactie te democratiseren door deze rechtstreeks in de browseromgeving te brengen. Dit betekent dat ontwikkelaars rijke, interactieve webervaringen kunnen bouwen die de mogelijkheden van fysieke apparaten benutten zonder gebruikers te dwingen afzonderlijke, mogelijk complexe, applicaties te downloaden en te installeren. Dit is met name gunstig voor een wereldwijd publiek waar software-installatie een hindernis kan zijn vanwege variƫrende internetsnelheden, apparaatcapaciteiten of administratieve beperkingen.
Kernconcepten en Functionaliteit
Om de Web USB API effectief te gebruiken, is het cruciaal om de kerncomponenten en hun interactie te begrijpen:
1. Apparaatdetectie en -selectie
De eerste stap in de communicatie met een USB-apparaat is het ontdekken en selecteren ervan. De Web USB API biedt mechanismen waarmee de browser verbonden USB-apparaten kan opsommen en de gebruiker kan laten kiezen tot welk apparaat toegang wordt verleend.
navigator.usb.getDevices(): Deze methode haalt een lijst op van alle USB-apparaten waartoe de huidige oorsprong eerder toestemming heeft gekregen. Dit is handig voor het opnieuw verbinden met eerder gebruikte apparaten.navigator.usb.requestDevice(options): Dit is de primaire methode om een nieuwe verbinding te initiƫren. Het toont de gebruiker een dialoogvenster voor apparaatkeuze, waardoor deze een USB-apparaat kan selecteren uit de beschikbare apparaten. Deoptions-parameter is hier cruciaal, omdat deze filters specificeert op basis van leveranciers-ID (VID) en product-ID (PID), of USB-klasse, -subklasse en -protocol. Dit zorgt ervoor dat alleen relevante apparaten aan de gebruiker worden gepresenteerd, wat de veiligheid en gebruikerservaring verbetert.
Voorbeeld (Conceptueel):
Stel dat we verbinding willen maken met een specifiek Arduino-bord. We zouden doorgaans de Vendor ID (bijv. 0x2341 voor Arduino) en Product ID (bijv. 0x0043 voor Arduino Uno) weten. De requestDevice-aanroep zou er ongeveer zo uitzien:
async function connectArduino() {
try {
const device = await navigator.usb.requestDevice({
filters: [{ vendorId: 0x2341, productId: 0x0043 }]
});
console.log("Verbonden met Arduino:", device);
// Ga verder met communicatie
} catch (error) {
console.error("Fout bij verbinden met apparaat:", error);
}
}
Het gebruik van async/await is standaardpraktijk voor het afhandelen van asynchrone operaties in modern JavaScript. De expliciete gebruikersprompt voor apparaatselectie is een kritieke beveiligingsfunctie die voorkomt dat kwaadwillende websites stilzwijgend toegang krijgen tot aangesloten hardware.
2. Apparaatweergave en -informatie
Zodra een apparaat is geselecteerd, levert de browser een USBDevice-object. Dit object omvat alle benodigde informatie en methoden om met het geselecteerde apparaat te interageren.
USBDevice-eigenschappen: HetUSBDevice-object bevat eigenschappen zoalsvendorId,productId,productName,manufacturerName,serialNumber, en informatie over zijnconfiguration,interfacesenopened-status.open(): Deze methode opent een verbinding met het apparaat, waardoor het klaar is voor gegevensoverdracht.close(): Deze methode sluit de verbinding met het apparaat.selectConfiguration(configurationValue): USB-apparaten kunnen meerdere configuraties hebben. Deze methode selecteert een specifieke configuratie om te gebruiken.claimInterface(interfaceNumber): Voordat een webapplicatie kan communiceren met een specifieke USB-interface op een apparaat, moet het die interface claimen. Dit voorkomt dat andere applicaties of het besturingssysteem interfereren.releaseInterface(interfaceNumber): Geeft een eerder geclaimde interface vrij.
Voorbeeld (Apparaatinformatie ophalen):
async function getDeviceInfo(device) {
if (device.opened) {
console.log(`Apparaat al open: ${device.productName}`);
} else {
await device.open();
console.log(`Apparaat succesvol geopend: ${device.productName}`);
}
if (device.configuration === null) {
// Als er geen configuratie is geselecteerd, selecteer dan de eerste
await device.selectConfiguration(1);
}
console.log("Vendor ID:", device.vendorId);
console.log("Product ID:", device.productId);
console.log("Productnaam:", device.productName);
console.log("Fabrikantnaam:", device.manufacturerName);
console.log("Serienummer:", device.serialNumber);
// Je kunt indien nodig ook interfaces weergeven
console.log("Interfaces:", device.interfaces);
}
Deze fase is cruciaal voor het tot stand brengen van een stabiel communicatiekanaal. Het concept van het selecteren van een configuratie en het claimen van een interface is fundamenteel voor hoe USB-apparaten werken en wordt direct weerspiegeld in de Web USB API.
3. Gegevensoverdracht
Zodra een interface is geclaimd, kunnen gegevens van en naar het apparaat worden verzonden en ontvangen. Dit gebeurt via eindpunten, die logische communicatiekanalen binnen een interface zijn.
- Eindpunten: USB-apparaten hebben invoer- (IN) en uitvoer- (OUT) eindpunten. Gegevens worden naar OUT-eindpunten verzonden en van IN-eindpunten ontvangen. Elk eindpunt heeft een uniek adres en een richting.
transferOut(endpointNumber, data): Verzendt gegevens naar een gespecificeerd OUT-eindpunt. Dedatakan eenBufferSourcezijn (bijv.ArrayBuffer,Uint8Array).transferIn(endpointNumber, length): Vraagt om een gespecificeerd aantal bytes te ontvangen van een gespecificeerd IN-eindpunt. Dit retourneert een promise die wordt opgelost met eenUSBInTransferResult-object dat de ontvangen gegevens bevat.clearHalt(direction, endpointNumber): Wist een eventuele 'halt'-status op een bepaald eindpunt.isochronousTransferIn(...),isochronousTransferOut(...): Voor real-time datastromen zoals audio of video worden isochrone overdrachten gebruikt, die gegarandeerde bandbreedte bieden maar geen foutcorrectie.
Voorbeeld (Gegevens verzenden en ontvangen):
async function sendAndReceive(device) {
// Aannemende dat interface 0, eindpunt 1 een OUT-eindpunt is en eindpunt 2 een IN-eindpunt
const OUT_ENDPOINT = 1;
const IN_ENDPOINT = 2;
const BYTES_TO_READ = 64; // Voorbeeld: Lees tot 64 bytes
// Gegevens verzenden
const dataToSend = new Uint8Array([0x01, 0x02, 0x03, 0x04]); // Voorbeeldgegevens
await device.transferOut(OUT_ENDPOINT, dataToSend);
console.log("Gegevens succesvol verzonden.");
// Gegevens ontvangen
const result = await device.transferIn(IN_ENDPOINT, BYTES_TO_READ);
if (result.data && result.data.byteLength > 0) {
const receivedData = new Uint8Array(result.data);
console.log("Ontvangen gegevens:", receivedData);
} else {
console.log("Geen gegevens ontvangen of overdracht onvolledig.");
}
}
Dit is de kern van de interactie. De mogelijkheid om willekeurige gegevens te verzenden en te ontvangen, maakt volledige controle over het aangesloten USB-apparaat mogelijk, alleen beperkt door de firmware van het apparaat en de protocollen die het ondersteunt.
4. Controle-overdrachten
Naast standaard gegevensoverdrachten ondersteunt de Web USB API ook controle-overdrachten, die worden gebruikt voor apparaatconfiguratie, statusverzoeken en andere fundamentele operaties.
controlTransferIn(setup, length): Voert een controle-overdracht uit om gegevens van het apparaat te lezen.controlTransferOut(setup, data): Voert een controle-overdracht uit om gegevens naar het apparaat te schrijven.
De setup-parameter is een USBControlTransferParameters-object, dat het verzoektype, de ontvanger, de verzoekcode, de waarde en de index specificeert. Dit zijn low-level commando's die vaak overeenkomen met standaard USB-verzoeken.
Voorbeeld (Conceptuele Controle-overdracht):
async function getDeviceDescriptor(device) {
const setup = {
requestType: 'standard', // 'standaard', 'klasse' of 'leverancier'
recipient: 'device', // 'apparaat', 'interface', 'eindpunt' of 'anders'
request: 0x06, // Standaard USB-verzoek: GET_DESCRIPTOR
value: 0x0100, // Descriptortype: DEVICE (0x01), Index: 0
index: 0 // Index voor eindpuntdescriptor
};
const length = 18; // Lengte van een standaard apparaatdescriptor
const result = await device.controlTransferIn(setup, length);
if (result.data) {
console.log("Apparaatdescriptor:", new Uint8Array(result.data));
}
}
Controle-overdrachten zijn fundamenteel voor de initialisatie van apparaten en het opvragen van apparaatmogelijkheden, en worden vaak gebruikt voordat standaard gegevensoverdrachten kunnen beginnen.
Browserondersteuning en Beschikbaarheid
De Web USB API is een relatief nieuwe API, en de adoptie ervan varieert per browser en besturingssysteem. Momenteel heeft het de beste ondersteuning in:
- Google Chrome: Breed ondersteund op desktopplatforms (Windows, macOS, Linux).
- Microsoft Edge: Gebaseerd op Chromium, biedt het ook goede ondersteuning.
- Opera: Volgt over het algemeen de implementatie van Chrome.
Ondersteuning op andere browsers zoals Mozilla Firefox en Safari is beperkt of nog niet geĆÆmplementeerd. Het is ook belangrijk op te merken dat browserimplementaties subtiele verschillen kunnen hebben of dat specifieke vlaggen moeten worden ingeschakeld, vooral in eerdere versies. Voor een wereldwijd publiek betekent dit dat ontwikkelaars rekening moeten houden met de doelbrowseromgevingen. Een fallbackstrategie of een duidelijke indicatie van browsercompatibiliteit is essentieel voor wijdverspreide adoptie.
Bovendien vereist de Web USB API voor de meeste browsers een beveiligde context (HTTPS), wat het beveiligingsmodel verder versterkt. Dit betekent dat applicaties die Web USB gebruiken niet kunnen worden gehost op gewone HTTP-websites.
Veiligheidsoverwegingen
Veiligheid is van het grootste belang bij de toegang tot hardware vanuit een webbrowser. De Web USB API is ontworpen met verschillende beveiligingsfuncties:
- Toestemming van de gebruiker: Cruciaal is dat de browser nooit automatisch toegang verleent tot USB-apparaten. De gebruiker moet expliciet een apparaat selecteren via een door de browser geleverde prompt (met behulp van
navigator.usb.requestDevice()). Dit voorkomt dat kwaadwillende websites aangesloten randapparatuur kapen. - Oorsprong-binding: Toestemmingen die aan een website worden verleend, zijn gekoppeld aan de oorsprong (schema, domein en poort). Als een gebruiker toegang verleent tot een apparaat op
https://example.com, strekt die toestemming zich niet automatisch uit tothttps://subdomain.example.comofhttps://another-site.com. - Geen Stille Toegang: De API staat geen stille opsomming of verbinding van apparaten toe.
- Beperkte Privilege Escalatie: Hoewel de API krachtige toegang biedt, is deze ontworpen om binnen de sandbox van de browser te werken, wat het potentieel voor privilege-escalatie op het besturingssysteem van de gebruiker beperkt.
Deze maatregelen zijn essentieel voor de bescherming van gebruikers, vooral in diverse wereldwijde omgevingen waar apparaateigendom, beveiligingspraktijken en digitale geletterdheid aanzienlijk kunnen variƫren. Ontwikkelaars moeten hun gebruikers informeren over deze beveiligingsprompts en het belang van het alleen verlenen van toegang aan vertrouwde websites.
Praktische Toepassingen en Wereldwijde Voorbeelden
De Web USB API opent een wereld van mogelijkheden voor webapplicaties die interageren met fysieke apparaten. Hier zijn enkele voorbeelden van hoe het kan worden gebruikt in verschillende regio's en industrieƫn:
1. Onderwijs en Wetenschap
- Laboratoria op Afstand: Studenten in landen met beperkte toegang tot gespecialiseerde apparatuur kunnen via een webinterface verbinding maken met USB-microscopen, -spectrometers of -oscilloscopen in een centraal lab. Hierdoor kunnen ze op afstand experimenten uitvoeren en gegevens verzamelen. Een universiteit in India zou bijvoorbeeld een virtueel scheikundelab kunnen aanbieden waar studenten wereldwijd een via USB aangedreven titrator kunnen besturen.
- Interactieve Leermiddelen: Educatieve kits die microcontrollers (zoals Arduino of Raspberry Pi Pico) met USB-interfaces gebruiken, kunnen via webpagina's worden bestuurd. Dit maakt interactieve programmeerlessen mogelijk waarbij studenten, ongeacht hun locatie, het onmiddellijke effect van hun code op fysieke componenten kunnen zien. Stel je een codeerbootcamp in Braziliƫ voor die fysieke computerconcepten onderwijst met een webgebaseerde IDE die rechtstreeks communiceert met via USB aangesloten ledmatrices.
2. Industrie en Productie
- Machinebewaking en -besturing: Fabrieken kunnen webdashboards implementeren die verbinding maken met USB-uitgeruste sensoren of controllers op machines. Dit maakt real-time monitoring van productielijnen, temperatuurmetingen of drukniveaus mogelijk vanaf elk apparaat met een compatibele browser. Een productiefabriek in Duitsland zou een webapplicatie kunnen hebben die communiceert met USB-gebaseerde meetapparatuur om kwaliteitscontrolegegevens te loggen.
- Configuratietools: Het bijwerken van firmware of het configureren van instellingen op via USB aangedreven industriƫle apparatuur kan rechtstreeks via een webinterface gebeuren, waardoor de noodzaak voor eigen software-installatieprogramma's voor elk apparaattype wordt geƫlimineerd. Een bedrijf in Japan dat gespecialiseerd is in robotica, zou een webgebaseerde tool kunnen bieden om hun via USB aangesloten robotarmen eenvoudig te configureren.
3. Consumentenelektronica en IoT
- Beheer van Slimme Apparaten: Hoewel veel slimme apparaten Wi-Fi of Bluetooth gebruiken, hebben sommige mogelijk USB-interfaces voor de eerste installatie of geavanceerde diagnostiek. Een webapplicatie zou het onboardingproces voor een nieuwe, via USB aangesloten slimme thermostaat in Australiƫ kunnen vereenvoudigen.
- Aangepaste Randapparatuur: Hobbyisten en makers kunnen aangepaste webinterfaces maken voor hun via USB bestuurde apparaten. Dit kan variƫren van bedieningspanelen voor 3D-printers tot configurators voor aangepaste toetsenborden of besturingssystemen voor ledverlichting. Een makergemeenschap in Canada zou een gedeeld webplatform kunnen ontwikkelen om unieke, via USB aangedreven kunstinstallaties te besturen en te presenteren.
4. Gezondheidszorg
- Patiƫntbewaking (met Strikte Controles): In gecontroleerde omgevingen kunnen bepaalde niet-kritieke, via USB aangesloten gezondheidsmonitoringapparaten toegankelijk zijn via webinterfaces voor gegevensaggregatie en -weergave. Het is cruciaal om te benadrukken dat elke toepassing in de gezondheidszorg strikte naleving van privacyregelgeving (zoals HIPAA in de VS, GDPR in Europa) en robuuste beveiligingsprotocollen vereist. Een onderzoeksinstituut in het VK zou Web USB kunnen gebruiken voor het verzamelen van gegevens van via USB aangesloten omgevingssensoren in een langdurige patiƫntenstudie.
Uitdagingen en Beperkingen
Ondanks zijn potentieel, kent de Web USB API ook uitdagingen:
- Beperkte Browserondersteuning: Zoals vermeld, ondersteunen niet alle grote browsers Web USB, wat het bereik van applicaties die er uitsluitend op vertrouwen, beperkt. Dit vereist dat ontwikkelaars 'progressive enhancement' of alternatieve oplossingen voor niet-ondersteunde platforms overwegen.
- Stuurprogramma's van het Besturingssysteem: Hoewel Web USB veel van de complexiteit abstraheert, speelt het onderliggende besturingssysteem nog steeds een rol. Soms zijn specifieke stuurprogramma's nodig zodat het OS het USB-apparaat correct kan herkennen voordat de browser het zelfs kan weergeven. Dit kan met name lastig zijn in diverse wereldwijde IT-omgevingen.
- Complexiteit van USB-Protocollen: USB is een complex protocol. Het begrijpen van apparaatklassen, eindpunten, descriptoren en overdrachtstypes is essentieel. De Web USB API biedt een JavaScript-interface, maar de onderliggende kennis van USB-communicatie is nog steeds vereist.
- Beveiligingsprompts Kunnen Intimiderend Zijn: Hoewel noodzakelijk, kunnen de gebruikersprompts voor apparaattoegang verwarrend of alarmerend zijn voor gebruikers die niet bekend zijn met het concept, wat mogelijk leidt tot terughoudendheid om toestemming te geven. Duidelijke gebruikersvoorlichting is van vitaal belang.
- Geen Directe HID-ondersteuning (Historisch): Hoewel Web USB kan worden gebruikt om HID (Human Interface Device)-functionaliteit te emuleren, was directe toegang tot generieke HID-apparaten aanvankelijk een afzonderlijk initiatief (WebHID API). Web USB blijft echter de primaire manier om met aangepaste USB-apparaten te communiceren.
- Beperkte Toegang tot Low-Level Functies: De API abstraheert enkele van de zeer low-level USB-operaties omwille van veiligheid en bruikbaarheid. Voor zeer gespecialiseerde hardware-interacties die diepgaande controle over de timing van USB-pakketten of bus-enumeratie vereisen, is Web USB mogelijk niet voldoende.
Best Practices voor Wereldwijde Ontwikkeling
Bij het ontwikkelen van Web USB-applicaties voor een internationaal publiek, overweeg de volgende best practices:
- Prioriteer Gebruikerservaring en Voorlichting:
- Bied duidelijke, beknopte instructies over hoe USB-apparaten aan te sluiten en te autoriseren.
- Gebruik begrijpelijke taal en vermijd waar mogelijk jargon.
- Leg uit waarom browserprompts verschijnen en verzeker gebruikers van hun veiligheid.
- Bied meertalige ondersteuning voor alle voor de gebruiker zichtbare tekst en instructies.
- Implementeer Robuuste Fallbacks:
- Detecteer browserondersteuning voor Web USB en bied alternatieve functionaliteiten of informatieve berichten voor niet-ondersteunde browsers.
- Overweeg het aanbieden van een downloadbare begeleidende applicatie voor platforms of browsers waar Web USB niet haalbaar is.
- Handel Fouten Gracieus Af:
- USB-communicatie kan kwetsbaar zijn. Implementeer uitgebreide foutafhandeling voor verbindingsproblemen, mislukte gegevensoverdrachten en onverwachte apparaatstatussen.
- Geef informatieve foutmeldingen die de gebruiker begeleiden bij het oplossen van het probleem.
- Optimaliseer voor Prestaties en Bandbreedte:
- Als uw applicatie grote hoeveelheden gegevens van USB-apparaten moet verwerken, overweeg dan efficiƫnte gegevensverwerking in JavaScript (bijv. met getypte arrays) en mogelijk het 'debouncen' of 'throttlen' van updates om te voorkomen dat de browser of het apparaat wordt overbelast.
- Houd rekening met de uiteenlopende internetsnelheden en apparaatcapaciteiten wereldwijd bij het ontwerpen van datasynchronisatie of cloudgebaseerde functies.
- Test in Diverse Omgevingen:
- Test uw applicatie met een verscheidenheid aan USB-apparaten, besturingssystemen en browserversies.
- Simuleer verschillende netwerkomstandigheden en hardwareconfiguraties om de betrouwbaarheid te waarborgen.
- Houd je aan Beveiligingsnormen:
- Gebruik altijd HTTPS.
- Definieer duidelijk welke toestemmingen uw applicatie vereist en waarom.
- Wees transparant over gegevensverwerking en privacy.
- Benut Vendor- en Product-ID's Strategisch:
- Hoewel filteren op VID/PID gebruikelijk is, overweeg dan om bredere USB-klassen of -protocollen te ondersteunen als uw applicatie is ontworpen voor een reeks apparaten.
- Wees u ervan bewust dat sommige fabrikanten generieke VID/PID-paren gebruiken, wat mogelijk specifiekere filtering of gebruikersselectie vereist.
De Toekomst van Web USB
De Web USB API is een fundamentele stap om het web een interactiever en capabeler platform voor hardwarebesturing te maken. Naarmate browserleveranciers de API blijven implementeren en verfijnen, en naarmate meer ontwikkelaars het potentieel ervan verkennen, kunnen we een golf van innovatieve webapplicaties verwachten die naadloos integreren met de fysieke wereld.
De voortdurende ontwikkeling van gerelateerde webstandaarden, zoals de Web Serial API (voor seriƫle communicatie via USB) en de WebHID API (voor Human Interface Devices), versterkt verder het vermogen van het web om met hardware te interageren. Deze API's, wanneer gebruikt in combinatie met Web USB, creƫren een krachtige toolkit voor ontwikkelaars die geavanceerde browsergebaseerde hardwareoplossingen willen bouwen.
Voor een wereldwijde gemeenschap van ontwikkelaars vertegenwoordigt de Web USB API een kans om universeel toegankelijke tools en ervaringen te bouwen. Door de complexiteit van native ontwikkeling weg te abstraheren en een gestandaardiseerde, veilige interface te bieden, verlaagt het de drempel voor het creƫren van geavanceerde, hardware-gedreven webapplicaties. Of het nu voor onderwijs, industrie of persoonlijke projecten is, de mogelijkheid om rechtstreeks vanaf de browser verbinding te maken met USB-apparaten zal de manier waarop we met technologie omgaan, revolutioneren.
Conclusie
De Frontend Web USB API is een belangrijke vooruitgang in webtechnologie, die ontwikkelaars in staat stelt de kloof tussen de digitale en fysieke wereld te overbruggen. Door directe toegang tot en controle over USB-apparaten binnen de browser mogelijk te maken, ontsluit het een breed scala aan mogelijkheden voor het creƫren van interactieve, hardware-verbeterde webapplicaties. Hoewel uitdagingen met betrekking tot browserondersteuning en de inherente complexiteit van USB blijven bestaan, maken de duidelijke beveiligingsvoordelen en het potentieel voor cross-platform innovatie het een API die het ontdekken waard is.
Voor ontwikkelaars wereldwijd betekent het omarmen van de Web USB API het betreden van een tijdperk waarin webapplicaties meer kunnen bieden dan alleen informatie; ze kunnen tastbare interactie bieden met de apparaten die onze wereld vormgeven. Naarmate het ecosysteem volwassener wordt en de ondersteuning groeit, zal de Web USB API ongetwijfeld een onmisbaar hulpmiddel worden voor het bouwen van de volgende generatie verbonden, intelligente en universeel toegankelijke webervaringen.